package jframe.utils;



import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


/**
 * @描述:<p>日期时间工具类</p>
 *
 * @作者: 叶平平(yepp)
 *
 * @时间: 2011-4-30 下午05:14:45
 */
public class DateUtil {
    
    /**
     * <p>求两个日期相差天数</p>
     * @param sd 起始日期，格式yyyy-MM-dd
     * @param ed 终止日期，格式yyyy-MM-dd
     * @return 两个日期相差天数
     */
    public static long getIntervalDays(String sd, String ed) {
        //Date.valueOf转换成标准日期格式，getTime()获取到1970年以来的毫秒数
        return ((java.sql.Date.valueOf(ed)).getTime() - (java.sql.Date.valueOf(sd)).getTime())/ (3600 * 24 * 1000);
    }
    
    /**
     * <p>获取与指定日期相差指定天数的日期</p>
     * @param date yyyy/MM/dd
     * @param offset 正整数
     * @return yyyy/MM/dd
     */
    public static String getDateOffset(String date, int offset) {

        //Date tempDate = getDateObj(date, "[/]");
        Date tempDate = null;
        if(date.indexOf("/")>0){
            tempDate = getDateObj(date, "[/]");
            tempDate = getDateAdd(tempDate, offset);
            return getFormatDateTime(tempDate, "yyyy-MM-dd");
        }
        if(date.indexOf("-")>0){
            tempDate = getDateObj(date, "[-]");  
            tempDate = getDateAdd(tempDate, offset);
            return getFormatDateTime(tempDate, "yyyy-MM-dd");
        }
        return "";
    }
    
    /**
     * <p>取得指定分隔符分割的年月日的日期对象</p>
     * @param argsDate 格式为"yyyy-MM-dd"
     * @param split 时间格式的间隔符，例如“-”，“/”，要和时间一致起来。
     * @return 一个java.util.Date()类型的对象
     */
    public static Date getDateObj(String argsDate, String split) {
        String[] temp = argsDate.split(split);
        int year = new Integer(temp[0]).intValue();
        int month = new Integer(temp[1]).intValue();
        int day = new Integer(temp[2]).intValue();
        return getDateObj(year, month, day);
    }
    
    /**
     * <p>取得指定年月日的日期对象</p>
     * @param year 年
     * @param month 月注意是从1到12
     * @param day 日
     * @return 一个java.util.Date()类型的对象
     */
    public static Date getDateObj(int year, int month, int day) {
        Calendar c = new GregorianCalendar();
        c.set(year, month - 1, day);
        return c.getTime();
    }
    
    /**
     * <p>取得给定日期加上一定天数后的日期对象</p>
     * @param date 给定的日期对象
     * @param amount 需要添加的天数，如果是向前的天数，使用负数就可以.
     * @return Date 加上一定天数以后的Date对象
     */
    public static Date getDateAdd(Date date, int amount) {
        Calendar cal = new GregorianCalendar();
        cal.setTime(date);
        cal.add(GregorianCalendar.DATE, amount);
        return cal.getTime();
    }
    
    /**
     * <p>根据给定的格式与时间(Date类型的)，返回时间字符串。最为通用</p>
     * @param date 指定的日期
     * @param format 日期格式字符串
     * @return String 指定格式的日期字符串.
     */
    public static String getFormatDateTime(Date date, String format) {
        //Date date = new Date();
        //System.out.println(getFormatDateTime(date, "yyyy-MM-dd HH:mm:ss"));
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(date);
    }
    /**
	 * 功能描述：获取日期 时分秒为0
	 *
	 * @author  叶平平(ypp)
	 * <p>创建日期 ：2012-1-12 上午09:23:27</p>
	 *
	 * @param date
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static Date getDate(Date date){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.MILLISECOND, 0);  
		calendar.set(Calendar.SECOND, 0);  
		calendar.set(Calendar.MINUTE, 0);  
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		return calendar.getTime();
	}
	
	/**
	 * 功能描述：获得系统当前日期加/减指定天数后的日期
	 *
	 * @author  叶平平(ypp)
	 * <p>创建日期 ：2012-1-11 下午05:24:32</p>
	 *
	 * @param count	需要加/减的天数(需要减的时候需加上"-"号)
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static  Date getDateShift(int count){
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DATE, count);
		Date date = getDate(calendar.getTime()) ;
		return date;
	}
	/**
	 * 功能描述：获得系统当前日期加/减指定天数后的日期
	 *
	 * @author  叶平平(ypp)
	 * <p>创建日期 ：2012-1-11 下午05:24:32</p>
	 *
	 * @param count	需要加/减的天数(需要减的时候需加上"-"号)
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static  String getDateShift2(int count){
		SimpleDateFormat dateFormat = new SimpleDateFormat();
		dateFormat.applyPattern("yyyy-MM-dd HH:mm:ss");
		Calendar calendar = Calendar.getInstance();
		calendar.add(Calendar.DATE, count);
		Date date = getDate(calendar.getTime()) ;
		return dateFormat.format(date);
	}
	
	/**
	 * 功能描述：获得指定日期加/减指定天数后的日期
	 *
	 * @author  叶平平(ypp)
	 * <p>创建日期 ：2012-1-11 下午05:30:36</p>
	 *
	 * @param date	指定日期
	 * @param count 需要加/减的天数(需要减的时候需加上"-"号)
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static Date getDateShift(Date date, int count){
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.add(Calendar.DATE, count);
		Date resdate = getDate(calendar.getTime()) ;
		return resdate;
	}
	
	/**
	 * 功能描述：获得指定日期加/减指定天数后的日期
	 *
	 * @author  叶平平(ypp)
	 * <p>创建日期 ：2012-1-11 下午05:30:36</p>
	 *
	 * @param date	指定日期
	 * @param count 需要加/减的天数(需要减的时候需加上"-"号)
	 * @return
	 *
	 * <p>修改历史 ：(修改人，修改时间，修改原因/内容)</p>
	 */
	public static Date getDateShift(String date, int count){
		Date resdate = null;
		try {
			SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
			Calendar calendar = Calendar.getInstance();
			calendar.setTime(sdf.parse(date));
			calendar.add(Calendar.DATE, count);
			resdate = getDate(calendar.getTime()) ;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		return resdate;
	}
    public static void main(String[] args) {
      //  System.out.println(getIntervalDays("2010-10-11", "2010-12-11"));
        System.out.println(getDateOffset("2010-10-10", 30));
    }
}